package com.study.d012Components.treeview;

import java.util.List;

import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTablePosition;
import javafx.scene.control.TreeTableView;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
import javafx.scene.control.cell.TreeItemPropertyValueFactory;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.util.Callback;

/** TreeTableView的使用
*@description
*@author xtayhame
*date 2020年3月16日
*version
*since v1.0
*/
public class TreeTableViewMain extends Application{
	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage stage) throws Exception {
		AnchorPane an = new AnchorPane();
		TreeTableView<Organ> treeTableView = new TreeTableView<Organ>();
		treeTableView.setPrefSize(300, 400);

		TreeItem<Organ> root = new TreeItem<Organ>(new Organ("中国", true));

		TreeItem<Organ> item_gd = new TreeItem<Organ>(new Organ("广东省", true));
		TreeItem<Organ> item_gd_1 = new TreeItem<Organ>(new Organ("佛山市", true));
		TreeItem<Organ> item_gd_2 = new TreeItem<Organ>(new Organ("深圳市", false));

		item_gd.getChildren().addAll(item_gd_1,item_gd_2);

		TreeItem<Organ> item_hn = new TreeItem<Organ>(new Organ("河南省", true));
		TreeItem<Organ> item_hn_1 = new TreeItem<Organ>(new Organ("商丘市", true));
		TreeItem<Organ> item_hn_2 = new TreeItem<Organ>(new Organ("南阳市", false));

		item_hn.getChildren().addAll(item_hn_1,item_hn_2);

		root.getChildren().addAll(item_gd,item_hn);
		treeTableView.setRoot(root);





		TreeTableColumn<Organ, String> tc_name= new TreeTableColumn<Organ, String>("名称");
		TreeTableColumn<Organ, Boolean> tc_check= new TreeTableColumn<Organ, Boolean>("选中");

		//添加列
		treeTableView.getColumns().addAll(tc_name,tc_check);

		an.getChildren().add(treeTableView);
		AnchorPane.setTopAnchor(treeTableView, 20.0);
		AnchorPane.setLeftAnchor(treeTableView, 80.0);
		stage.setScene(new Scene(an, 400, 500));
		stage.show();



		//设置TreeTableView的属性
		//设置列的宽策略，TreeTableView.CONSTRAINED_RESIZE_POLICY 各个列的宽度一样
		treeTableView.setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY);

		//设置节点为展开状态
		root.setExpanded(true);
		item_gd.setExpanded(true);
		item_hn.setExpanded(true);

		//设置可以选择单元格
		treeTableView.getSelectionModel().setCellSelectionEnabled(true);

		// 注意： 这里使用name属性时，会去Organ里面找getName()方法的；也可以在Organ类中定义nameProperty，并让该方法返回SimplexxxProperty类型，则会自动进行数据更新
		//tc_name.setCellValueFactory(new TreeItemPropertyValueFactory<Organ,String>("name"));

		tc_name.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<Organ,String>, ObservableValue<String>>() {

			@Override
			public ObservableValue<String> call(CellDataFeatures<Organ, String> param) {

				return param.getValue().getValue().getNameProperty();
			}
		});

		//tc_check.setCellValueFactory(new TreeItemPropertyValueFactory<Organ,Boolean>("isCheck"));
		tc_check.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<Organ,Boolean>, ObservableValue<Boolean>>() {

			@Override
			public ObservableValue<Boolean> call(CellDataFeatures<Organ, Boolean> param) {
				// TODO Auto-generated method stub
				return param.getValue().getValue().getIsCheckProperty();
			}
		});


		//设置为多选
		treeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

		//监听选中事件
		treeTableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<Organ>>() {
			@Override
			public void changed(ObservableValue<? extends TreeItem<Organ>> observable, TreeItem<Organ> oldValue,
					TreeItem<Organ> newValue) {
				System.out.println("[只能获取单行]");
				System.out.println("		你当前选择的是：" + newValue);

			}
		});

		//获取多选的行
		treeTableView.getSelectionModel().getSelectedIndices().addListener(new InvalidationListener() {

			@Override
			public void invalidated(Observable observable) {
				System.out.println("通过getSelectedIndices()获取多选行：");
				List<Integer>  list=(List<Integer>)observable;
				if(list !=null && list.size() > 0){
					for(Integer i:list){
						TreeItem<Organ> item=treeTableView.getTreeItem(i);
						if(item !=null){
							System.out.println("              "+item.getValue());
						}
					}
				}
			}
		});


		//获取多选的行
		treeTableView.getSelectionModel().getSelectedItems().addListener(new InvalidationListener() {

			@Override
			public void invalidated(Observable observable) {
				System.out.println("通过getSelectedItems()获取多选行：");
				List<TreeItem<Organ>> list = (List<TreeItem<Organ>> )observable;
				if(list !=null && list.size() > 0){
					for(TreeItem<Organ> t:list){
						System.out.println("               " + t.getValue());
					}
				}

			}
		});


		//获取所选择的列
		//在获取列之前，需要设置列编辑为开启状态 treeTableView.getSelectionModel().setCellSelectionEnabled(true);
		treeTableView.getSelectionModel().getSelectedCells().addListener(new InvalidationListener() {
			@Override
			public void invalidated(Observable observable) {
				System.out.println("使用getSelectedCells获取列：");

				List<TreeTablePosition<Organ, String>>  list=(List<TreeTablePosition<Organ, String>>)observable;
				if(list !=null && list.size() > 0){
					for(TreeTablePosition<Organ, String> t:list){
						//System.out.println(t.getTreeItem().getValue());
						System.out.println("		列："+t.getColumn() + "    行：" + t.getRow() + "    值：" + t.getTableColumn().getCellData(t.getRow()));
					}
				}

			}
		});

	}
}
